package com.bbva.kyfb.kyfbws.converters;

import java.util.ArrayList;
import java.util.List;

import org.drools.core.util.StringUtils;

import com.bbva.jee.arq.spring.core.gce.CodigoError;
import com.bbva.kyfb.kyfbdto.firmas.bo.Auditoria;
import com.bbva.kyfb.kyfbdto.firmas.bo.ComponenteFirmable;
import com.bbva.kyfb.kyfbdto.firmas.bo.DeletedFilesDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaNifDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaNifOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaRefDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.EmpresaRefOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroConfeccion;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroPdteFirma;
import com.bbva.kyfb.kyfbdto.firmas.bo.FirmanteInfo;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoComponentDetailDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.InfoDetailItemDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.NotificacionOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.OrdenMifidOutDto;
import com.bbva.kyfb.kyfbdto.firmas.bo.UpdateInfoOutDto;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.DeletedFilesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponent;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoComponentDetail;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDeletedFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDeletedFiles;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoDetailItem;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAudit;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompanie;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileCompaniesResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileFir;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileMiFID;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSendNotificationResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignerUser;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoSignerUserRealized;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoUpdateNumeroAleatorioResponse;
import com.bbva.kyfb.kyfbutils.constantes.UtilFO;
import com.bbva.kyfb.kyfbutils.errores.ValidationUtils;

/**
 * The Class DtoInToDtoOut.
 */
public final class DtoInToDtoOut {

	/** The Constant VALIDATION_ERROR. */
	private static final CodigoError VALIDATION_ERROR = Errores_kyfb_servicios.ERROR_FORMATEO_RESPUESTA;

	/**
	 * Instantiates a new dto in to dto out.
	 */
	private DtoInToDtoOut() {
		////Evitamos instanciacion
	}
	/**
	 * Orden mifid out dto to info file mi fid.
	 *
	 * @param ordenMifidOutDto the orden mifid out dto
	 * @return the info file mi fid
	 */
	public static InfoFileMiFID ordenMifidOutDtoToInfoFileMiFID(final OrdenMifidOutDto ordenMifidOutDto) {
		ValidationUtils.validarObligatorios(new Object[]{ordenMifidOutDto}, VALIDATION_ERROR, false);
		final InfoFileMiFID infoFileMiFID = new InfoFileMiFID();
		infoFileMiFID.setsTipoMiFID(ordenMifidOutDto.getTipoMifid());
		return infoFileMiFID;
	}

	/**
	 * Empresa ref out dto to info file companie.
	 *
	 * @param empresaRefOutDto the empresa ref out dto
	 * @return the info file companies response
	 */
	public static InfoFileCompaniesResponse empresaRefOutDtoToInfoFileCompanie(final EmpresaRefOutDto empresaRefOutDto) {
		ValidationUtils.validarObligatorios(new Object[]{empresaRefOutDto, empresaRefOutDto.getEmpresasRefDto()}, VALIDATION_ERROR, false);
		final InfoFileCompaniesResponse infoFileCompaniesResponse = new InfoFileCompaniesResponse();
		InfoFileCompanie infoFileCompanie = null;

		for (final EmpresaRefDto empresaRefDto : empresaRefOutDto.getEmpresasRefDto()) {
			ValidationUtils.validarObligatorios(new Object[]{empresaRefDto }, VALIDATION_ERROR, false);
			infoFileCompanie = new InfoFileCompanie();
			infoFileCompanie.setsCodigoCliente(empresaRefDto.getCclien());
			infoFileCompanie.setDniNif(empresaRefDto.getCdnitr());
			infoFileCompanie.setsNombre(empresaRefDto.getDenomb());
			infoFileCompaniesResponse.getInfoCompanies().add(infoFileCompanie);
		}

		return infoFileCompaniesResponse;

	}

	/**
	 * Empresa nif out dto to info file companie.
	 *
	 * @param empresaNifOutDto the empresa nif out dto
	 * @return the info file companies response
	 */
	public static InfoFileCompaniesResponse empresaNifOutDtoToInfoFileCompanie(final EmpresaNifOutDto empresaNifOutDto) {
		ValidationUtils.validarObligatorios(new Object[]{empresaNifOutDto, empresaNifOutDto.getEmpresaNifDto()}, VALIDATION_ERROR, false);
		final InfoFileCompaniesResponse infoFileCompaniesResponse = new InfoFileCompaniesResponse();
		InfoFileCompanie infoFileCompanie = null;

		for (final EmpresaNifDto empresanifDto : empresaNifOutDto.getEmpresaNifDto()) {
			ValidationUtils.validarObligatorios(new Object[]{empresanifDto}, VALIDATION_ERROR, false);
			infoFileCompanie = new InfoFileCompanie();
			infoFileCompanie.setDniNif(empresanifDto.getCdnitr());
			infoFileCompanie.setsCodigoCliente(empresanifDto.getCclien());
			infoFileCompanie.setsCodigoClienteR(empresanifDto.getScodclienteR());
			infoFileCompanie.setsNombre(empresanifDto.getDenomb());
			infoFileCompaniesResponse.getInfoCompanies().add(infoFileCompanie);
		}

		return infoFileCompaniesResponse;
	}

	/**
	 * Deleted files dto to i deleted files response.
	 *
	 * @param deletedFilesDto the deleted files dto
	 * @return the deleted files response
	 */
	public static DeletedFilesResponse deletedFilesDtoToIDeletedFilesResponse(final List<DeletedFilesDto> deletedFilesDto) {
		ValidationUtils.validarObligatorios(new Object[]{deletedFilesDto}, VALIDATION_ERROR, false);
		final InfoDeletedFiles infodeletedFiles = new InfoDeletedFiles();
		InfoDeletedFile infoDeletedFile = null;

		for (final DeletedFilesDto deleteFile : deletedFilesDto) {
			ValidationUtils.validarObligatorios(new Object[]{deleteFile}, VALIDATION_ERROR, false);
			infoDeletedFile = new InfoDeletedFile();
			infoDeletedFile.setCodError(deleteFile.getCodError());
			infoDeletedFile.setsIdOrdenFirmas(deleteFile.getOrdenFirmas());
			infoDeletedFile.setsTipoOrden(deleteFile.getTipoOrden());
			infodeletedFiles.getInfoDeletedFiles().add(infoDeletedFile);
		}

		final DeletedFilesResponse deletedFilesResponse = new DeletedFilesResponse();
		deletedFilesResponse.setInfoDeletedFiles(infodeletedFiles);

		return deletedFilesResponse;

	}

	/**
	 * Notificacion out dto to info send notification.
	 *
	 * @param notifiacionOutDto the notifiacion out dto
	 * @return the info send notification response
	 */
	public static InfoSendNotificationResponse notificacionOutDtoToInfoSendNotification(final NotificacionOutDto notifiacionOutDto) {
		ValidationUtils.validarObligatorios(new Object[]{notifiacionOutDto}, VALIDATION_ERROR, false);
		final InfoSendNotificationResponse infoSendNotificationResponse = new InfoSendNotificationResponse();
		infoSendNotificationResponse.setCodError(notifiacionOutDto.getCodError());
		infoSendNotificationResponse.setsIdSession(notifiacionOutDto.getsIdSession());

		return infoSendNotificationResponse;
	}

	/**
	 * Creates the info component from componentes firmables.
	 *
	 * @param componentesFirmables the componentes firmables
	 * @return the array list
	 */
	public static ArrayList<InfoComponent> componentesFirmablesBoToInfoComponentsFacade(final List<ComponenteFirmable> componentesFirmables) {
		ValidationUtils.validarObligatorios(new Object[]{componentesFirmables}, VALIDATION_ERROR, false);
		final ArrayList<InfoComponent> infoComponents= new ArrayList<InfoComponent>();
		for(final ComponenteFirmable componenteFir: componentesFirmables) {
			infoComponents.add(componenteFirmableBoToInfoComponentFacade(componenteFir));
		}
		return infoComponents;
	}


	/**
	 * Componente firmable bo to info component facade.
	 *
	 * @param componenteFirmable the componente firmable
	 * @return the info component
	 */
	public static InfoComponent componenteFirmableBoToInfoComponentFacade(final ComponenteFirmable componenteFirmable) {
		ValidationUtils.validarObligatorios(new Object[]{componenteFirmable}, VALIDATION_ERROR, false);
		final InfoComponent info = new InfoComponent();
		info.setsCodTipoOrden(componenteFirmable.getTipoOrden());
		info.setsDesOrden(componenteFirmable.getDescripcion());
		info.setsTipoCorte(componenteFirmable.getTipoCorte());
		info.setHmsCorte(componenteFirmable.getHoraCorte());
		info.setCodigoServicio(componenteFirmable.getCodigoServicio());
		info.setMensajeAviso(componenteFirmable.getMensajeAviso());
		info.setCodigoMensajeAviso(componenteFirmable.getCodigoMensajeAviso());
		return info;
	}

	/**
	 * Crear dto info file audit.
	 *
	 * @param list the list
	 * @return the array list
	 */
	public static ArrayList<InfoFileAudit> auditoriasBoToInfoFileAuditsFacade(final List<Auditoria> list) {
		ValidationUtils.validarObligatorios(new Object[]{list}, VALIDATION_ERROR, false);
		final ArrayList<InfoFileAudit> infoFiles = new ArrayList<InfoFileAudit>();
		for(final Auditoria fichero:list){
			infoFiles.add(auditoriaBoToInfoFileAuditFacade(fichero));
		}
		return infoFiles;
	}

	/**
	 * Auditoria bo to info file audit facade.
	 *
	 * @param fichero the fichero
	 * @return the info file audit
	 */
	public static InfoFileAudit auditoriaBoToInfoFileAuditFacade(final Auditoria fichero) {
		ValidationUtils.validarObligatorios(new Object[]{fichero}, VALIDATION_ERROR, false);
		final InfoFileAudit info= new InfoFileAudit();
		info.setsCodAccion(fichero.getsCodAccion());

		if(fichero.getsCodEstado()!=null) {
			info.setsCodEstado(UtilFO.getCodSigla(fichero.getsCodEstado()));
		}

		info.setsCodUsuario(fichero.getsCodUsuario());
		info.setsCodUsuarioFirma(fichero.getsCodUsuarioFirma());
		info.setsFechaAccion(fichero.getsFechaAccion());
		info.setsPesoOrden(fichero.getdPesoOrden());
		info.setsPoderUsuarioFirmante(fichero.getsPoderUsuarioFirmante());
		return info;
	}


	/**
	 * Crear dto info file.
	 *
	 * @param list the list
	 * @return the array list
	 */
	public static ArrayList<InfoFile> ficherosConfeccionToInfoFiles(final List<FicheroConfeccion> list) {
		final ArrayList<InfoFile> infoFiles = new ArrayList<InfoFile>();
		for(final FicheroConfeccion fichero : list){
			infoFiles.add(ficheroConfeccionToInfoFile(fichero));
		}
		return infoFiles;
	}

	/**
	 * Fichero confeccion to info file.
	 *
	 * @param fichero the fichero
	 * @return the info file
	 */
	public static InfoFile ficheroConfeccionToInfoFile(final FicheroConfeccion fichero) {
		ValidationUtils.validarObligatorios(new Object[]{fichero, fichero.getdImporte()}, VALIDATION_ERROR, false);
		final InfoFile info= new InfoFile();
		info.setdFechaProceso(fichero.getdFechaProceso());
		info.setdFechaCreacion(fichero.getdFechaCreacion());
		info.setiNumeroOrdenes(fichero.getiNumeroOrdenes());
		info.setlImporte(fichero.getdImporte().doubleValue());
		info.setsNombreFichero(fichero.getsNombreFichero());
		info.setsIdOrdenFirmas(fichero.getsIdOrdenFirmas());
		if(fichero.getsCodEstadoFichero()!=null) {
			String estadoSigla = UtilFO.getCodSigla(fichero.getsCodEstadoFichero());
			if(!StringUtils.isEmpty(estadoSigla)){
				info.setsCodEstadoFichero(estadoSigla);
			}else{
				info.setsCodEstadoFichero(fichero.getsCodEstadoFichero());
				
			}			
		}
		info.setsCodTipoOrden(fichero.getsCodTipoOrden());
		info.setsAsunto(fichero.getsAsunto());
		info.setsDivisa(fichero.getsDivisa());
		info.setsFormaPago(fichero.getFormaPago());
		return info;
	}

	/**
	 * Crear dto info file.
	 *
	 * @param list the list
	 * @return the array list
	 */
	public static ArrayList<InfoFileFir> ficherosPdteFirmaToInfoFileFirs(final List<FicheroPdteFirma> list) {
		final ArrayList<InfoFileFir> infoFiles = new ArrayList<InfoFileFir>();
		for(final FicheroPdteFirma fichero:list) {
			infoFiles.add(ficheroPdteFirmaToInfoFileFir(fichero));
		}
		return infoFiles;
	}

	/**
	 * Fichero pdte firma to info file fir.
	 *
	 * @param fichero the fichero
	 * @return the info file fir
	 */
	public static InfoFileFir ficheroPdteFirmaToInfoFileFir(final FicheroPdteFirma fichero) {
		ValidationUtils.validarObligatorios(new Object[]{fichero,fichero.getdImporte()}, VALIDATION_ERROR, false);
		final InfoFileFir info = new InfoFileFir();
		info.setdFechaProceso(fichero.getdFechaProceso());
		info.setiNumeroOrdenes(fichero.getiNumeroOrdenes());
		info.setlImporte(fichero.getdImporte().doubleValue());
		info.setsNombreFichero(fichero.getsNombreFichero());
		info.setsIdOrdenFirmas(fichero.getsIdOrdenFirmas());
		if(fichero.getsCodEstadoFichero()!=null) {
			info.setsCodEstadoFichero(fichero.getsCodEstadoFichero());
		}
		info.setsCodTipoOrden(fichero.getsCodTipoOrden());
		info.setsAsunto(fichero.getsAsunto());
		info.setsDivisa(fichero.getsDivisa());
		info.setlPesoActual(fichero.getlPesoActual());
		info.setlPesoFichero(fichero.getlPesoFichero());
		info.setdFechaCreacion(fichero.getdFechaCreacion());
		// 15.10.2013. Ya no vamos a generar el numero aleatorio
		// info.setsNumeroAleatorio(Long.toString(FuncionesPAU.getNumeroAleatorio(9)));
		info.setsNumeroAleatorio(fichero.getsNumeroAleatorio());
		info.setEsOrdenMifid(fichero.getEsOrdenMiFID());
		info.setsPoderFirma(fichero.getsPoderFirma());
		info.setMensajeAceptacion(fichero.getMensajeAceptacion());
		info.setCodigoMensajeAceptacion(fichero.getCodigoMensajeAceptacion());
		return info;
	}

	/**
	 * Creates the info signers from firmantes info.
	 *
	 * @param firmantes the firmantes
	 * @return the array list
	 */
	public static  ArrayList<InfoSignerUserRealized> firmantesInfoToInfoSignersUserRealized(final List<FirmanteInfo> firmantes) {
		ValidationUtils.validarObligatorios(new Object[]{firmantes}, VALIDATION_ERROR, false);
		final ArrayList<InfoSignerUserRealized> infoUsers = new ArrayList<InfoSignerUserRealized>();
		for(final FirmanteInfo firmante: firmantes) {
			infoUsers.add(firmanteInfoToInfoSignerUserRealized(firmante));
		}
		return infoUsers;
	}

	/**
	 * Firmante info to info signer user realized.
	 *
	 * @param firmante the firmante
	 * @return the info signer user realized
	 */
	public static InfoSignerUserRealized firmanteInfoToInfoSignerUserRealized(final FirmanteInfo firmante) {
		ValidationUtils.validarObligatorios(new Object[]{firmante}, VALIDATION_ERROR, false);
		final InfoSignerUserRealized infoSigner= new InfoSignerUserRealized();
		infoSigner.setsCodUsuario(firmante.getCodUsuario());
		infoSigner.setsModoFirma(firmante.getsTipoFirma());
		infoSigner.setsPoderFirma(firmante.getPoderFirma());
		return infoSigner;
	}



	/**
	 * Creates the info signers from firmantes info pdtes.
	 *
	 * @param posiblesFirmantes the posibles firmantes
	 * @return the array list
	 */
	public static ArrayList<InfoSignerUser> firmantesInfoToInfoSignersUser(final List<FirmanteInfo> posiblesFirmantes) {
		ValidationUtils.validarObligatorios(new Object[]{posiblesFirmantes}, VALIDATION_ERROR, false);
		final ArrayList<InfoSignerUser> infoUsers = new ArrayList<InfoSignerUser>();
		for(final FirmanteInfo firmante: posiblesFirmantes) {
			infoUsers.add(firmanteInfoToInfoSignerUser(firmante));
		}
		return infoUsers;
	}

	/**
	 * Firmante info to info signer user.
	 *
	 * @param firmante the firmante
	 * @return the info signer user
	 */
	public static InfoSignerUser firmanteInfoToInfoSignerUser(final FirmanteInfo firmante) {
		ValidationUtils.validarObligatorios(new Object[]{firmante}, VALIDATION_ERROR, false);
		final InfoSignerUser infoSigner= new InfoSignerUser();
		infoSigner.setsCodUsuario(firmante.getCodUsuario());
		infoSigner.setsPoderFirma(firmante.getPoderFirma());
		infoSigner.setsNomUsuario(firmante.getsNomUsuario());
		infoSigner.setsTipoFirma(firmante.getsTipoFirma());
		infoSigner.setsTipoFirmante(firmante.getsTipoFirmante());
		infoSigner.setsNumeroAleatorio(firmante.getNumeroAleatorio());
		infoSigner.setMensajeAceptacion(firmante.getsSnMsgacp());
		return infoSigner;
	}

	/**
	 * Info components detail out dto to info components detail.
	 *
	 * @param compDetOutDto the comp det out dto
	 * @return the info component detail
	 */
	public static InfoComponentDetail infoComponentsDetailOutDtoToInfoComponentsDetail(final InfoComponentDetailDto compDetOutDto) {
		ValidationUtils.validarObligatorios(new Object[]{compDetOutDto, compDetOutDto.getDetalle()}, VALIDATION_ERROR, false);
		final InfoComponentDetail infoComponentDetail = new InfoComponentDetail();
		InfoDetailItem infoDetailItem;

		infoComponentDetail.setCodError(compDetOutDto.getCodError());
		for(final InfoDetailItemDto infoDetItDto : compDetOutDto.getDetalle()){
			ValidationUtils.validarObligatorios(new Object[]{infoDetItDto}, VALIDATION_ERROR, false);
			infoDetailItem = new InfoDetailItem();
			infoDetailItem.setsCampo(infoDetItDto.getsCampo());
			infoDetailItem.setsTipo(infoDetItDto.getsTipo());
			infoDetailItem.setsValor(infoDetItDto.getsValor());
			infoComponentDetail.getDetalle().add(infoDetailItem);
		}
		return infoComponentDetail;
	}

	/**
	 * Convierte objetos de UpdateInfoOutDto a objetos de InfoUpdateNumeroAleatorioResponse
	 * @param infoOut el DTO UpdateInfoOutDto
	 * @return el objeto InfoUpdateNumeroAleatorioResponse
	 */
	public static InfoUpdateNumeroAleatorioResponse infoUpdateOutToinfoUpdateResponse(final UpdateInfoOutDto infoOut) {
		ValidationUtils.validarObligatorios(new Object[]{infoOut, infoOut.getsNumeroAleatorio()}, VALIDATION_ERROR, false);
		final InfoUpdateNumeroAleatorioResponse salida = new InfoUpdateNumeroAleatorioResponse();

		salida.setsNumeroAleatorio(infoOut.getsNumeroAleatorio());

		return salida;
	}

}
